#! /bin/bash
# =====================================
# FastAPI 应用管理脚本
# 启动、停止、重启后台服务
# =====================================

# 定义应用名称
APP_NAME="hunter-ai"
# 定义应用目录
APP_DIR="/usr/local/pywork/hunter-ai"
# 定义虚拟环境目录
VENV_DIR="$APP_DIR/venv"
APP_MODULE="app.main:app"
HOST="0.0.0.0"
PORT=8000

# 定义应用日志目录
LOG_DIR="$APP_DIR/logs"
PID_FILE="$LOG_DIR/$APP_NAME.pid"

# 创建应用日志目录（如果不存在）
mkdir -p $LOG_DIR

# 检查是否已启动
is_running() {
    if [ -f "$PID_FILE" ]; then
        pid=$(cat "$PID_FILE")
        if ps -p "$pid" > /dev/null 2>&1; then
            return 0
        else
            return 1
        fi
    else
        return 1
    fi
}

# 启动应用
start_app() {
    if is_running; then
        echo "$APP_NAME 应用已启动"
        exit 0
    fi

    echo "启动 $APP_NAME 应用..."
    source $VENV_DIR/bin/activate
    nohup "$VENV_DIR/bin/uvicorn" "$APP_MODULE" --host "$HOST" --port "$PORT" --workers 2 \
        > "$LOG_DIR/$APP_NAME.out.log" 2> "$LOG_DIR/$APP_NAME.err.log" &
    echo $! > "$PID_FILE"
    echo "$APP_NAME 应用已启动, PID: $!"
}

# 停止应用
function stop_app() {
    if ! is_running; then
        echo "$APP_NAME 应用未启动"
        exit 0
    fi
    pid=$(cat "$PID_FILE")
    echo "停止 $APP_NAME 应用(PID: $pid)..."
    kill -SIGTERM "$pid"
    sleep 2
    if ps -p "$pid" > /dev/null 2>&1; then
        echo "$APP_NAME 应用未停止，尝试强制终止"
        kill -SIGKILL "$pid"
    fi
    rm -f "$PID_FILE"
    echo "$APP_NAME 应用已停止"
}

# 重启应用
function restart_app() {
    echo "重启 $APP_NAME 应用..."
    stop_app
    sleep 1
    start_app
    echo "$APP_NAME 应用已重启, PID: $!"
}

status() {
    if is_running; then
        echo "$APP_NAME 应用已启动"
    else
        echo "$APP_NAME 应用未启动"
    fi
}

case "$1" in
    start)
        start_app
        ;;
    stop)
        stop_app
        ;;
    restart)
        restart_app
        ;;
    status)
        status
        ;;
    *)
        echo "用法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac